/*@@

	Copyright (c) 2010 BlueSky LTD. All rights reserved. 

	Created_datetime : 	2010-6-21

	File Name :	base_packfile.h

	Author : liusiliang (siliangliu@msn.com)

	Description : 

@@*/

#ifndef __BASE_PACKFILE_H__
#define __BASE_PACKFILE_H__

//////////////////////////////////////////////////////////////////////////
//						Header Include
//////////////////////////////////////////////////////////////////////////

#include "blk_def.h"
#include "blk_stl.h"
#include "base/base_packmgr.h"

namespace BLK
{
	//////////////////////////////////////////////////////////////////////////
	//						Class Declare
	//////////////////////////////////////////////////////////////////////////

	class PackFile
	{
		/*
		 *	功能:	文件读取模式
		 */
		enum ReadMode
		{
			FIRST_LOADFROM_DISK,	//优先从磁盘读取 
			FIRST_LOADFROM_PACK,	//优先从文件包读取
		};

		enum FileOrigin
		{
			FileBegin,
			FileCurrent,
			FileEnd,
		};

	public:

		/*
		 *	功能:	构造函数	
		 */
		PackFile(void);

		/*
		 *	功能:	析构函数	
		 */
		~PackFile(void);

	public:
		
		/*
		 *	功能:	打开一个文件, 先寻找当前目录下是否有同名的单独文件
		 *	参数:	pszFileName	文件路径
		 *	返回:	是否成功打开
		 */
		bool Open(const char* pszFileName);

		/*
		 *	功能:	关闭文件
		 */
		void Close(void);
		
		/*
		 *	功能:	判断此文件是否从包中打开的
		 *	返回:	是否从包中打开的
		 */
		bool IsFileInPak(void);
		
		/*
		 *	功能:	从文件中读取数据
		 *	参数:	pBuffer		缓冲区指针
		 *			dwSize		要读取的长度
		 *	返回:	读到的字节长度
		 */
		unsigned long Read(
			void* pBuffer, 
			unsigned uSize);
		
		/*
		 *	功能:	文件读指针定位
		 *	参数:	lOffset			偏移量
		 *			dwMethod		定位方法
		 *	返回:	文件的指针
		 */
		unsigned long Seek(
			int nOffset, 
			FileOrigin uMethod);

		/*
		 *	功能:	返回文件的指针
		 *	返回:	文件的指针
		 */
		unsigned long Tell(void);

		/*
		 *	功能:	返回文件大小
		 *	返回:	文件的大小 in bytes
		 */
		unsigned long Size(void);
				
		/*
		 *	功能:	设置文件读取模式
		 *	参数:	nFileMode	文件读取模式
		 */
		static void SetPackFileMode(ReadMode Mode);

	private:

		std::ifstream		m_File;		// 磁盘文件(不在包中)

		PackElemFileRef		m_PackRef;	// 文件在包中的信息

		static ReadMode		m_ReadMode;	// 文件读取模式

	};
};

#endif
